import Vue from 'vue'
import Router from 'vue-router'
import Home from '../views/Home'
import Login from '../views/Login'
import NotFound from '../views/404'
import api from '../http/api'
import store from '../store'

Vue.use(Router);

const router = new Router({
  routes: [
    {
      path: '/',
      name: '首页',
      component: Home,
      children: []
    },
    {
      path: '/login',
      name: '登录',
      component: Login
    },
    {
      path: '/404',
      name: 'notFound',
      component: NotFound
    }
  ]
});

// 登录界面登录成功之后，会把用户信息保存在会话
// 存在时间为会话生命周期，页面关闭即失效。
router.beforeEach((to, from, next) => {
  let username = localStorage.getItem('account');
  // 如果是访问登录界面，如果用户会话信息存在，代表已登录过，跳转到主页
  if (to.path === '/login') {
    if (username) {
      next({path: '/'});
    } else {
      next();
    }
  } else {
    // 如果访问非登录界面，且户会话信息不存在，代表未登录，则跳转到登录界面
    if (!username) {
      next({path: '/login'});
    } else {
      // 加载动态菜单和路由
      addDynamicMenuAndRoutes(username, to, from);
      next();
    }
  }
});

function addDynamicMenuAndRoutes(username, to, from) {
  if (store.state.app.menuRouteLoaded) {
    console.log('动态菜单和路由已经存在.');
    return;
  }
  //请求菜单接口
  api.menu.findNavTree({'username': username})
    .then(res => {
      //添加动态路由
      let dynamicRoutes = addDynamicRoutes(res.data);
      router.options.routes[0].children = router.options.routes[0].children.concat(dynamicRoutes);
      router.addRoutes(router.options.routes);
      //保存加载状态
      store.commit('menuRouteLoaded', true);
      //保存菜单树
      store.commit('setNavTree', res.data);
    }).then(res => {
    api.user.findPermissions({'username': username})
      .then(res => {
        //保存用户权限
        store.commit('setPerms', res.data);
      })
  }).catch(error => {
    console.error("addDynamicMenuAndRoutes：" + JSON.stringify(error));
  })
}

/**
 * 添加动态菜单路由
 * @param menuList 菜单列表
 * @param routes  递归创建的动态菜单路由
 */
function addDynamicRoutes(menuList = [], routes = []) {
  let temp = [];
  for (let i = 0; i < menuList.length; i++) {
    if (menuList[i].children && menuList[i].children.length >= 1) {
      temp = temp.concat(menuList[i].children);
    } else if (menuList[i].url && /\S/.test(menuList[i].url)) {
      menuList[i].url = menuList[i].url.replace(/^\//, '');
      //创建路由配置
      let route = {
        path: menuList[i].url,
        component: null,
        name: menuList[i].name,
        meta: {
          icon: menuList[i].icon,
          index: menuList[i].id
        }
      };
      try {
        let array = menuList[i].url.split('/');
        let url = '';
        for (let i = 0; i < array.length; i++) {
          url += array[i].substring(0, 1).toUpperCase() + array[i].substring(1) + '/';
        }
        url = url.substring(0, url.length - 1);
        route['component'] = resolve => require([`@/views/${url}`], resolve);
      } catch (e) {
        console.error(e);
      }
      routes.push(route);
    }
  }

  if (temp.length >= 1) {
    addDynamicRoutes(temp, routes);
  } else {
    console.log('动态路由加载......');
    console.log(routes);
    console.log('动态路由加载完成');
  }
  return routes;
}

export default router;
